package ArrayListPlus;

import java.util.ArrayList;

//public class GenericsDemo5 {
//    public static void main(String[] args) {
//        ArrayList<Ye> list1 = new ArrayList<>();
//        ArrayList<Fu> list2 = new ArrayList<>();
//        ArrayList<Zi> list3 = new ArrayList<>();
//
////        泛型不具备继承性
////        methods(list1);
////        methods(list2);
////        methods(list3);
////        数据具备继承性
////        list1.addAll(list1);
////        list1.addAll(list2);
////        list1.addAll(list3);
//
//    }
//
//    public static void methods(ArrayList<Ye> list) {
//    }
//}
//
///*
// * 泛型不具备继承性
// * */
//class Ye {
//}
//
//class Fu extends Ye {
//}
//
//class Zi extends Fu {
//}


public class GenericsDemo5 {
    public static void main(String[] args) {
        ArrayList<Ye> list1 = new ArrayList<>();
        ArrayList<Fu> list2 = new ArrayList<>();
        ArrayList<Zi> list3 = new ArrayList<>();
        ArrayList<Student2> list4 = new ArrayList<>();


        methods(list1);
        methods(list2);
        methods(list3);

        // 泛型方法只能接受Ye类或者其子类的参数

        /*
        *   需要的类型:
            ArrayList
            <? extends Ye>

            提供的类型:
            ArrayList
            <Student2>
        * */

//        methods(list4); //Student2
    }

    /*
     * 泛型方法
     * 这样子书写泛型方法
     * 会同时接受Ye、Fu、Zi、Student2类型的参数 Student2和其它类没有继承关系 同样可以被泛型接受
     * 相对这种情况做限制的话可以使用
     * <E extends Ye> 指定泛型参数必须是Ye类或者其子类
     * <E super Ye> 指定泛型参数必须是Ye类或者其父类
     *
     * 泛型通配符：可以限制泛型的范围
     * 如果类型不确定 但是能知道以后只能传递某个继承体系中的，就可以使用泛型通配符
     */
    public static void methods(ArrayList<? extends Ye> list) {
    }
}

/*
 * 泛型不具备继承性
 * */
class Ye {
}

class Fu extends Ye {
}

class Zi extends Fu {
}

class Student2 {}
